package cn.fengsweb.tokyotyrant
{
	import flash.utils.ByteArray;

	internal class Util
	{
		public static function echo(bytes:ByteArray):void
		{
			if(null != bytes){
				var pst:uint	= bytes.position;
				
				bytes.position	= 0;
				
				var str:String	= "";
				str += "[LENGTH]: "+bytes.length+" bytes\n[HEX]   : ";
				
				while(bytes.bytesAvailable){
					str	+= uint(bytes.readByte()&0xFF).toString(16)+" ";
				}
				trace(str);
				
				bytes.position	= pst;
			}
		}
		
		public static function bytes2Object(bytes:ByteArray):Object
		{
			if(null == bytes){
				return null;
			}
			
			var obj:Object	= new Object();
			
			var rnum:uint	= bytes.readUnsignedInt()/2;
			for(var i:uint=0; i<rnum; i++){
				var ksiz:uint	= bytes.readUnsignedInt();
				var kbuf:String	= bytes.readUTFBytes(ksiz);
				var vsiz:uint	= bytes.readUnsignedInt();
				var vbuf:String	= bytes.readUTFBytes(vsiz);
				
				obj[kbuf]		= vbuf;
			}
			
			return obj;
		}
		
		public static function object2Bytes(obj:Object):ByteArray
		{
			var bytes:ByteArray	= new ByteArray();
			
			for(var key:* in obj){
				bytes.writeBytes(string2Bytes(key));
				bytes.writeBytes(string2Bytes(obj[key]));
			}
			
			return bytes;
		}
		
		public static function string2Bytes(value:String, includeSize:Boolean=false):ByteArray
		{
			var bytes:ByteArray	= new ByteArray();
			if(includeSize){
				bytes.writeUnsignedInt(value.length);
			}	
				bytes.writeUTFBytes(value);
				
			return bytes;
		}
		
		public static function splitBytes2Object(bytes:ByteArray, keyEnd:uint, valueEnd:uint):Object
		{
			var keyBytes:ByteArray		= new ByteArray();
			var valueBytes:ByteArray	= new ByteArray();
			var isKey:Boolean			= true;
			
			var currentKey:String;
			var retObj:Object			= new Object;
			
			
			//遍历字节以keyEnd和valueEnd为分割点划分
			bytes.position	= 0;
			while(bytes.bytesAvailable){
				var byte:int	= bytes.readByte();
				
				switch(byte){
					case keyEnd:
						isKey	= false;
						if(0 < keyBytes.length){
							keyBytes.position	= 0;
							currentKey			= keyBytes.readUTFBytes(keyBytes.length);
							keyBytes			= new ByteArray();
						}
						break;
					
					case valueEnd:
						isKey	= true;
						if(0 < valueBytes.length && 0 < currentKey.length){
							valueBytes.position	= 0;
							retObj[currentKey]	= valueBytes.readUTFBytes(valueBytes.length);
							valueBytes			= new ByteArray();
						}
						break;
					
					default:
						if(isKey){
							keyBytes.writeByte(byte);
						}else{
							valueBytes.writeByte(byte);
						}
				}
			}
			
			return retObj;
		}
	}
}